home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / crayola / common / crayVect.c < prev    next >
C/C++ Source or Header  |  1993-01-15  |  6KB  |  234 lines

  1. #include <stdio.h>
  2.  
  3. #include "geom.h"
  4. #include "vectP.h"
  5. #include "crayolaP.h"
  6.  
  7. static char msg[] = "crayVect.c";
  8.  
  9. void *cray_vect_HasColor(int sel, Geom *geom, va_list args);
  10. void *cray_vect_HasVColor(int sel, Geom *geom, va_list args);
  11. void *cray_vect_HasFColor(int sel, Geom *geom, va_list args);
  12.  
  13. void *cray_vect_UseVColor(int sel, Geom *geom, va_list args);
  14. void *cray_vect_UseFColor(int sel, Geom *geom, va_list args);
  15.  
  16. void *cray_vect_EliminateColor(int sel, Geom *geom, va_list args);
  17.  
  18. void *cray_vect_SetColorAt(int sel, Geom *geom, va_list args);
  19. void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list args);
  20.  
  21. void *cray_vect_GetColorAt(int sel, Geom *geom, va_list args);
  22. void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list args);
  23.  
  24. #define MAX_METHODS 12
  25.  
  26. static craySpecFunc methods[] = {
  27.   "crayHasColor", cray_vect_HasColor,
  28.   "crayHasVColor", cray_vect_HasVColor,
  29.   "crayHasFColor", cray_vect_HasFColor,
  30.   
  31.   "crayCanUseVColor", crayTrue,
  32.   "crayCanUseFColor", crayTrue,
  33.   
  34.   "crayUseVColor", cray_vect_UseVColor,
  35.   "crayUseFColor", cray_vect_UseFColor,
  36.   
  37.   "crayEliminateColor", cray_vect_EliminateColor,
  38.   
  39.   "craySetColorAt", cray_vect_SetColorAt,
  40.   "craySetColorAtV", cray_vect_SetColorAtV,
  41.   
  42.   "crayGetColorAt", cray_vect_GetColorAt,
  43.   "crayGetColorAtV", cray_vect_GetColorAtV,
  44.   };
  45.  
  46. cray_vect_init() {
  47.   crayInitSpec(methods, MAX_METHODS, GeomClassLookup("vect"));
  48.   return 0;
  49. }
  50.  
  51. void *cray_vect_HasColor(int sel, Geom *geom, va_list args) {
  52.   Vect *v = (Vect *)geom;
  53.   return (void *)(v->ncolor);
  54. }
  55.  
  56. void *cray_vect_HasFColor(int sel, Geom *geom, va_list args) {
  57.   Vect *v = (Vect *)geom;
  58.   return (void *)((v->ncolor == v->nvec) ? 1 : 0);
  59. }
  60.  
  61. void *cray_vect_HasVColor(int sel, Geom *geom, va_list args) {
  62.   Vect *v = (Vect *)geom;
  63.   return (void *)((v->ncolor == v->nvert) ? 1 : 0);
  64. }
  65.  
  66. void *cray_vect_UseVColor(int sel, Geom *geom, va_list args) {
  67.   Vect *v = (Vect *)geom;
  68.   int h, i, j, k;
  69.   ColorA *color, *def;
  70.  
  71.   def = va_arg(args, ColorA *);
  72.  
  73.   /* h = current point
  74.    * i = current polyline
  75.    * j = current point in polyline
  76.    * k = current color index (in cold list of colors)
  77.    */
  78.   color = OOGLNewNE(ColorA, v->nvert, msg);
  79.   for (h = i = k = 0; i < v->nvec; i++) {
  80.     if (v->vncolor[i]) def = &v->c[k];
  81.     for (j = 0; j < abs(v->vnvert[i]); j++) {
  82.       color[h++] = *def;
  83.       if (v->vncolor[i] > 1) def++;
  84.     }
  85.     k += v->vncolor[i];
  86.     v->vncolor[i] = abs(v->vnvert[i]);
  87.   }
  88.  
  89.   if (v->c != NULL) OOGLFree(v->c);
  90.   v->c = color;
  91.   v->ncolor = v->nvert;
  92.   return (void *)geom;
  93. }
  94.  
  95. void *cray_vect_UseFColor(int sel, Geom *geom, va_list args) {
  96.   Vect *v = (Vect *)geom;
  97.   int h, i, k;
  98.   ColorA *color, *def;
  99.  
  100.   def = va_arg(args, ColorA *);
  101.  
  102.   color = OOGLNewNE(ColorA, v->nvec, msg);
  103.  
  104.   /* 
  105.    * i = current polyline
  106.    * j = current vertex of current polyline
  107.    * k = current color
  108.    * h = current vertex of vect
  109.    */
  110.   for (h = i = k = 0; i < v->nvec; i++) {
  111.     switch(v->vncolor[i]) {
  112.     case 1:
  113.       def = &v->c[k++];
  114.     case 0:
  115.       color[i] = *def;
  116.       break;
  117.     default:
  118.       if (v->vncolor[i] != abs(v->vnvert[i])) {
  119.     OOGLError(1, "Illegal # of colors / # of vertices combination.");
  120.     return (void *)0;
  121.       }
  122.       def = &v->c[k + 1];
  123.       color[i] = *def;
  124.       k += abs(v->vnvert[i]);
  125.       break;
  126.     }
  127.     v->vncolor[i] = 1;
  128.   }
  129.  
  130.   if (v->c != NULL) OOGLFree(v->c);
  131.   v->c = color;
  132.   v->ncolor = v->nvec;
  133.  
  134.   return (void *)geom;
  135. }
  136.  
  137.  
  138. void *cray_vect_EliminateColor(int sel, Geom *geom, va_list args)
  139. {
  140.   int i;
  141.   Vect *v = (Vect *)geom;
  142.   if (!crayHasColor(geom, NULL)) return 0;
  143.   if (v->ncolor) OOGLFree(v->c);
  144.   v->c = NULL;
  145.   v->ncolor = 0;
  146.   for (i = 0; i < v->nvec; i++) v->vncolor[i] = 0;
  147.   return (void *)geom;
  148. }
  149.  
  150. void *cray_vect_SetColorAt(int sel, Geom *geom, va_list args) {
  151.   Vect *v = (Vect *)geom;
  152.   ColorA *color;
  153.   int vindex, findex, *eindex;
  154.   HPoint3 *pt;
  155.  
  156.   color = va_arg(args, ColorA *);
  157.   vindex = va_arg(args, int);
  158.   findex = va_arg(args, int);
  159.   eindex = va_arg(args, int *);
  160.   pt = va_arg(args, HPoint3 *);
  161.   if (vindex != -1) craySetColorAtV(geom, color, vindex, NULL, pt);
  162.   else {
  163.     craySetColorAtV(geom, color, eindex[0], NULL, pt);
  164.     craySetColorAtV(geom, color, eindex[1], NULL, pt);
  165.   }
  166.   return (void *)geom;
  167. }
  168.  
  169. void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list args) {
  170.   Vect *v = (Vect *)geom;
  171.   ColorA *color;
  172.   int index;
  173.   int i, j, k;
  174.  
  175.   color = va_arg(args, ColorA *);
  176.   index = va_arg(args, int);
  177.   if (index == -1) return NULL;
  178.   for (i = j = k = 0; i < v->nvec;
  179.        i++, j+= abs(v->vnvert[i]), k += v->vncolor[i])
  180.     if (j + abs(v->vnvert[i]) > index) break;
  181.   switch(v->vncolor[i]) {
  182.   case 0:
  183.     return NULL;
  184.   case 1:
  185.     v->c[k] = *color;
  186.     break;
  187.   default:
  188.     v->c[k + (index - j)] = *color;
  189.     break;
  190.   }
  191.  
  192.   return (void *)geom;
  193. }
  194.  
  195. void *cray_vect_GetColorAt(int sel, Geom *geom, va_list args) {
  196.   Vect *v = (Vect *)geom;
  197.   ColorA *color;
  198.   int vindex, findex, *eindex;
  199.  
  200.   color = va_arg(args, ColorA *);
  201.   vindex = va_arg(args, int);
  202.   findex = va_arg(args, int);
  203.   eindex = va_arg(args, int *);
  204.   if (vindex != -1) 
  205.     return (void *)crayGetColorAtV(geom, color, vindex, NULL, NULL);
  206.   else return (void *)crayGetColorAtV(geom, color, eindex[0], NULL, NULL);
  207. }
  208.  
  209. void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list args) {
  210.   Vect *v = (Vect *)geom;
  211.   ColorA *color;
  212.   int index;
  213.   int i, j, k;
  214.  
  215.   color = va_arg(args, ColorA *);
  216.   index = va_arg(args, int);
  217.   if (index == -1 || !v->ncolor) return NULL;
  218.   for (i = j = k = 0; i < v->nvec;
  219.        i++, j+= abs(v->vnvert[i]), k += v->vncolor[i])
  220.     if (j + abs(v->vnvert[i]) > index) break;
  221.   switch(v->vncolor[i]) {
  222.   case 1:
  223.     k++;
  224.   case 0:
  225.     *color = v->c[k];
  226.     break;
  227.   default:
  228.     *color = v->c[k + (index - j)];
  229.     break;
  230.   }
  231.     
  232.   return (void *)geom;
  233. }
  234.